﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Proyecta.Data.Helpers
{
    public class QueryConditions : IGenerableQuery
    {
        public List<QueryCondition> Condiciones { get; set; }

        protected Query Query { get; set; }

        public int Count
        {
            get { return this.Condiciones.Count; }
        }

        internal QueryConditions(Query query)
        {
            this.Query = query;
            this.Condiciones = new List<QueryCondition>();
        }

        public Query Add(params QueryCondition[] condiciones)
        {
            foreach (QueryCondition cond in condiciones)
                this.Condiciones.Add(cond);
            return this.Query;
        }

        public Query Add(string exp1, CompareOperator comparacion, string exp2)
        {
            return this.Add(false, exp1, comparacion, exp2);
        }

        public Query Add(bool negar, string exp1, CompareOperator comparacion, string exp2)
        {
            return this.Add(LogicOperator.And, negar, exp1, comparacion, exp2);
        }

        public Query Add(LogicOperator operador, string exp1, CompareOperator comparacion, string exp2)
        {
            return this.Add(operador, false, exp1, comparacion, exp2);
        }

        public Query Add(LogicOperator operador, bool negar, string exp1, CompareOperator comparacion, string exp2)
        {
            QueryCondition cond = new QueryCondition();
            cond.Operador = operador;
            cond.Negar = negar;
            cond.Expresion1 = exp1;
            cond.Comparacion = comparacion;
            cond.Expresion2 = exp2;
            this.Condiciones.Add(cond);
            return this.Query;
        }

        public void Generate(StringBuilder sql)
        {
            int i = 0;
            foreach (QueryCondition cond in this.Condiciones)
            {
                if (i > 0) sql.Append(" " + Enum.GetName(cond.Operador.GetType(), cond.Operador).ToUpper() + " ");
                if (i == 0 && this.Condiciones.Count > 1) sql.Append("(");
                cond.Generate(sql);
                if (i++ == this.Condiciones.Count - 1 && this.Condiciones.Count > 1) sql.Append(")");
            }
        }
    }
}